home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifcico / call.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-04  |  3.1 KB  |  170 lines

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "lutil.h"
  4. #include "xutil.h"
  5. #include "ftn.h"
  6. #include "nodelist.h"
  7. #include "config.h"
  8. #include "session.h"
  9.  
  10. extern int forcedcalls;
  11. extern char *forcedphone;
  12. extern char *forcedline;
  13. #if defined(HAS_TCP) || defined(HAS_TERM)
  14. extern char *inetaddr;
  15. #endif
  16.  
  17. extern char *get_modem_string(modem_string*,node*);
  18. extern int openport(char*,int);
  19. #if defined(HAS_TCP) || defined(HAS_TERM)
  20. extern int opentcp(char*);
  21. extern void closetcp(void);
  22. #endif
  23. extern void localport(void);
  24. extern void nolocalport(void);
  25. extern void closeport(void);
  26. extern int dialphone(node*,char*);
  27. extern int hangup(node*);
  28. extern void rdoptions(node*);
  29. extern int nodelock(faddr*);
  30. extern int nodeulock(faddr*);
  31.  
  32. int call(addr)
  33. faddr *addr;
  34. {
  35.     node *nlent;
  36.     int rc=1;
  37.     int speed;
  38.     char *portlist,*p,*q;
  39.  
  40.     if ((nlent=getnlent(addr)) == NULL)
  41.     {
  42.         logerr("cannot call %s: fatal in nodelist lookup",
  43.             ascfnode(addr,0x1f));
  44.         return 1;
  45.     }
  46.  
  47.     if (nodelock(addr))
  48.     {
  49.         loginf("system %s locked",ascinode(addr,0x1f));
  50.         return 1;
  51.     }
  52.  
  53.     rdoptions(nlent);
  54.  
  55.     inbound=protinbound; /* master sessions are secure */
  56.  
  57.     if ((nlent->phone || forcedphone
  58. #if defined(HAS_TCP) || defined(HAS_TERM)
  59.                      || inetaddr
  60. #endif
  61.                             ) &&
  62.         (forcedcalls || 
  63.          (((nlent->pflag & (DUMMY|DOWN|HOLD|PVT)) == 0) && 
  64.           ((localoptions & NOCALL) == 0))))
  65.     {
  66.         loginf("calling %s (%s, phone %s)",ascfnode(addr,0x1f),
  67.             nlent->name,nlent->phone?nlent->phone:forcedphone);
  68. #if defined(HAS_TCP) || defined(HAS_TERM)
  69.         if (inetaddr)
  70.         {
  71.             rc=opentcp(inetaddr);
  72.             if (rc)
  73.             {
  74.                 loginf("cannot connect %s",inetaddr);
  75.                 nodeulock(addr);
  76.                 return rc;
  77.             }
  78.         }
  79.         else
  80. #endif
  81.              if (forcedline)
  82.         {
  83.             rc=openport(forcedline,0);
  84.             if (rc)
  85.             {
  86.                 loginf("cannot open port %s",forcedline);
  87.                 nodeulock(addr);
  88.                 return rc;
  89.             }
  90.         }
  91.         else
  92.         {
  93.             if ((portlist=xstrcpy(get_modem_string(modemport,nlent))) == NULL)
  94.             {
  95.                 logerr("no matching ports defined");
  96.                 nodeulock(addr);
  97.                 return 1;
  98.             }
  99.             for (rc=1,p=strtok(portlist," \t,");
  100.                 rc && p;
  101.                 p=strtok(NULL," \t,"))
  102.             {
  103.                 if ((q=strrchr(p,':')))
  104.                 {
  105.                     *q++='\0';
  106.                     if ((*q == 'l') || (*q == 'L'))
  107.                     {
  108.                         speed=atoi(++q);
  109.                     }
  110.                     else
  111.                     {
  112.                         speed=atoi(q);
  113.                         if (nlent->speed < speed)
  114.                             speed=nlent->speed;
  115.                     }
  116.                 }
  117.                 else speed=0;
  118.                 rc=openport(p,speed);
  119.             }
  120.             if (rc)
  121.             {
  122.                 loginf("no free matching ports");
  123.                 free(portlist);
  124.                 nodeulock(addr);
  125.                 return rc;
  126.             }
  127.             free(portlist);
  128.         }
  129. #if defined(HAS_TCP) || defined(HAS_TERM)
  130.         if (!inetaddr)
  131. #endif
  132.         if ((rc=dialphone(nlent,forcedphone?forcedphone:nlent->phone)))
  133.         {
  134.             loginf("dial failed");
  135.             nodeulock(addr);
  136.         }
  137.  
  138.         if (rc == 0)
  139.         {
  140. #if defined(HAS_TCP) || defined(HAS_TERM)
  141.             if (!inetaddr)
  142. #endif
  143.                 nolocalport();
  144.             rc=session(addr,nlent,SESSION_MASTER,
  145.                 SESSION_UNKNOWN,NULL);
  146.         }
  147. #if defined(HAS_TCP) || defined(HAS_TERM)
  148.         if (inetaddr)
  149.         {
  150.             closetcp();
  151.         }
  152.         else
  153. #endif
  154.         {
  155.             localport();
  156.             hangup(nlent);
  157.             closeport();
  158.         }
  159.     }
  160.     else
  161.     {
  162.         loginf("cannot call %s (%s, phone %s)",
  163.             ascfnode(addr,0x1f),nlent->name,
  164.             nlent->phone);
  165.         nodeulock(addr);
  166.     }
  167.  
  168.     return rc;
  169. }
  170.